/**
 *
 * Espacio de nombres principal
 * 
 * Depende de:
 *	var ELGG_MAPS_WEBPATH: path al raiz del plugin/mod de elgg:
 *	OpenLayers
 *	jQuery
 *	
  * @class ElggMap 
 */
ElggMap = {
	init: function(customOptions)
	{
		assertUndefined(OpenLayers);
		assertUndefined(jQuery);
		assertUndefined(ELGG_MAPS_WEBPATH);	
		
		/* 
		 * chequeo las opciones pasadas y las combino en este namespace
		 */
		$.extend(true, this, customOptions);
		
		ElggMap.editing(false);
		
		this.Event.subscribe( "afterinit", function() {
			
		});
		

		//El evento afterinit recibe las opciones recibidas como argumento
		this.Event.fire( "afterinit", customOptions );
	},
	
	/**
     * Copia cosas de source a target
     *
     * @access private
     * @param target    {Object}  el objeto destino en donde se copiarán las
	 *							  cosas
     * @param source    {Object}  el objeto origen del cual se copiarán las
	 *							  cosas
     * @param overwrite {Boolean} Indica si los items existentes deberían ser
	 *							  sobreescritos
     * @param tranform  {function} [Optional], función de transformación para
	 *							  cada item
     */
    copy: function(target, source, overwrite, transform) {
      for (var key in source) {
        if (overwrite || typeof target[key] === 'undefined') {
          target[key] = transform ? transform(source[key]) :  source[key];
        }
      }
      return target;
    },
	
	/**
     * Crea un objeto con espacio de nombres (namespace).
     *
     * @access private
     * @param name {String} nombre full qualified ('Util.foo', etc.)
     * @param value {Object} valor a setear. El default es {}. [Optional]
     * @return {Object} El objeto creado
     */
    create: function(name, value) {
      var node = window.ElggMap, // Uso ElggMap como espacio de nombres raiz
      nameParts = name ? name.split('.') : [],
      c = nameParts.length;
      for (var i = 0; i < c; i++) {
        var part = nameParts[i];
        var nso = node[part];
        if (!nso) {
          nso = (value && i + 1 == c) ? value : {};
          node[part] = nso;
        }
        node = nso;
      }
      return node;
    },
	
	/**
     * Copia cosas de un objeto al espacio de nombres especificado dentro
	 * del namespace raiz. O sea, quedaría ElggMap.<target>.
	 * Si el namespace target no existe entonces, se crea automáticamente
     *
     * @access private
     * @param target    {Object|String}  El objeto destino en el cual copiar
     * @param source    {Object}         El objeto origen desde el cual copiar
     * @param overwrite {Boolean}        indica si se debe sobreescribir
     * @return {Object} El *mismo* objeto destino de vuelta
     */
    provide: function(target, source, overwrite) {
	  // una string significa un objeto separado por puntos en el cual 
	  // se va agrega algo o va a ser creado
      return ElggMap.copy(
        typeof target == 'string' ? ElggMap.create(target) : target,
        source,
        overwrite
      );
    },
	
	/**
	 * Log general a consola
	 * 
	 * @param args {String} El mensaje a grabar
	 */
	log: function(args)
	{
		// TODO : agregar un log.history
		if (window.Debug && window.Debug.writeln) {
          window.Debug.writeln(args);
        } else if (window.console) {
          window.console.log(args);
        }
	}
	
};
//  esto está absolutamente de más
var elggMap = ElggMap;
